package com.netty.server.handler;

import cn.hutool.core.util.HexUtil;
import com.netty.server.cmd.ByteCmd;
import com.netty.server.cmd.ByteResCmd;
import com.netty.server.cmd.Header;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 上行数据首先经过该解码器
 *
 * @author: 王霄
 * @date: 2022/1/17 14:07
 **/
@Slf4j
public class BaseDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> obj) {
        //读取管道数据
        byte[] bs = new byte[buf.readableBytes()];
        buf.readBytes(bs);
        log.info("收到数据包: [{}]", HexUtil.encodeHexStr(bs));
        //获取协议头
        byte header = buf.getByte(0);
        switch (Header.get(header)) {
            //如果是事件包,就分发给事件处理器
            case EVENT -> obj.add(ByteCmd.deserialize(bs));
            //如果是响应包,就分发给响应处理器
            case RESPONSE -> obj.add(ByteResCmd.deserialize(bs));
        }
    }
}
